package com.yellowcong.http.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.yellowcong.kanman.Constants;
import com.yellowcong.kanman.dto.Chapter;

/**
 * 创建日期:2018/02/28<br/>
 * 创建时间:10:49:21<br/>
 * 创建用户:yellowcong<br/>
 * 机能概要:
 */
public class KanmanUtils {

	/**
	  * 创建日期:2018/02/28<br/>
	  * 创建时间:10:08:28<br/>
	  * 创建用户:yellowcong<br/>
	  * 机能概要:下载一个章节的数据
	  * @param chapter 
	  * @return 是否下载成功
	 */
	public static boolean downloadChapter(Chapter  chapter) {
		HttpImageUtils utils = HttpImageUtils.getInstance();
		
		//创建文件夹,当文件不存在的情况
		String outPath = mkdirIfNotExit(chapter);
		
		//下载这一章的所有图片
		for(int i=0;i<chapter.getSize();i++) {
			
			//图片的下载地址
			String urlPathStr = String.format(Constants.PIC_HOST_URL, chapter.getChapterNow(),i+1);
			
			///4.jpg-kmw.middle
			String imgName = urlPathStr.substring(urlPathStr.lastIndexOf("/")+1);
			
			//获取文件输出地址
			imgName = outPath+"\\"+imgName.replace("-kmw.middle", "");
			
			//打印文件下载图片地址
			System.out.println(imgName);
			
			//下载图片
			utils.downloadImage(urlPathStr, imgName);
			
		}
		return true;
	}
   /**
    * 创建日期:2018/02/28<br/>
    * 创建时间:9:34:15<br/>
    * 创建用户:yellowcong<br/>
    * 机能概要:创建文件夹，如果不存在的情况
    * @param path
    * @return 反回文件夹地址
   */
	public static String mkdirIfNotExit(Chapter chapter) {
		//上一层的文件夹名称
		String outChapterPathName = Constants.OUT_PATH+chapter.getTitle();
		File file = new File(outChapterPathName);
		
		if(!file.exists()) {
			file.mkdirs();
		}
		return file.getAbsolutePath();
		
	}
	/**
	  * 创建日期:2018/02/28<br/>
	  * 创建时间:9:56:09<br/>
	  * 创建用户:yellowcong<br/>
	  * 机能概要:
	  * @param path 需要爬取的漫画地址
	  * @return 返回所有的章节信息，包含每章的页面大小
     */
	public static BlockingQueue<Chapter> getAllChapter(String path){
	   String htmlStr = HttpClient.get(path);

       //将解析的html转化为
       Document homeDoc = Jsoup.parse(htmlStr);

       //获取到所有的链接
       Element element = homeDoc.select(".chapter-list").first();

       //获取所有的章节信息
       Elements pages = element.getElementsByTag("a");
       
       System.out.println("章节数目\t"+pages.size());
       
   	//创建一个队列
       BlockingQueue<Chapter> queue = new ArrayBlockingQueue<Chapter>(pages.size());
       
       for(int i=0;i<pages.size();i++) {
           Element node = pages.get(i);
           
           //每一章节的地址
           String chapterUrl = Constants.HOME_URL + node.attr("href");
           String regEx = "([\\d]+)([\\w]*)";
   		
   		Pattern pattern = Pattern.compile(regEx);
           Matcher matcher = pattern.matcher(node.attr("href"));
           String chapterNow =  "";
           if(matcher.find()){
           	chapterNow = matcher.group(1);
           }
           //章节的名称
           String chapterNm = node.html();
           //章节大小
           int size = getPageSize(chapterUrl);
           
           //TODO　章节大小问题
           System.out.printf("第%s章:%s\t地址:%s\t页面数:%s\r\n",chapterNow,chapterNm,chapterUrl,size);
           
           Chapter chapter = new Chapter(chapterNm,chapterUrl,Integer.parseInt(chapterNow), size);
           //不要番外的信息
           if(chapter.getTitle().indexOf("番外") <0) {
           	queue.add(chapter);
           }
       }
       //返回队列
       return queue;
	}
	
	/**
	 * 创建日期:2018年2月27日<br/>
	 * 创建时间:下午9:55:59<br/>
	 * 创建用户:yellowcong<br/>
	 * 机能概要:获取网站的页面条数
	 * @param chapterUrl 章节数目
	 * 比如 http://m.kanman.com/25933/412.html
	 * @return 
	 */
	public static int getPageSize(String chapterUrl){
		//get pageInfo
       try {
			String htmlStr = HttpClient.get(chapterUrl);

			String pageInfostr = htmlStr.substring(htmlStr.indexOf("totalimg"),htmlStr.indexOf("mhname"));
			
			String regEx = "([\\w]+:)([\\d]+)(,[\\w]*)";
			
			Pattern pattern = Pattern.compile(regEx);
			Matcher matcher = pattern.matcher(pageInfostr);
			
			if(matcher.find()){
				int pageSize = Integer.parseInt(matcher.group(2));
				return pageSize;
			}
		} catch (Exception e) {
			throw new RuntimeException(chapterUrl+"页面获取失败");
		}
		return 0;
	}

}
